package com.lz.demo.log.jul;

import com.lz.demo.log.jul.subpackage.SubPackageTest;
import org.slf4j.bridge.SLF4JBridgeHandler;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

/**
 * 参考：https://blog.csdn.net/ITzhangdaopin/article/details/88018589
 * 1.resources 下 logging.properties 必须有奥配置，否则默认将使用 $JAVA_HOME/jre/lib/logging.properties 作为配置，jul-to-slf4j 将无法生效；
 * 2.在 jul-to-slf4j 引入后，要配置 handlers = org.slf4j.bridge.SLF4JBridgeHandler，不能再追加以前 handler 的配置，否则控制台和文件还会都有输出
 *   如果不改 handler 的配置，还保留“handlers = java.util.logging.ConsoleHandler,java.util.logging.FileHandler”，
 *   可以加上这段代码，实现一样的效果：
 *   static {
 *           SLF4JBridgeHandler.removeHandlersForRootLogger();
 *           SLF4JBridgeHandler.install();
 *     }
 * 3.在 resources 下配置 logging.properties 文件后，slf4j 的日志也会受这个配置文件影响，比如：
 *      .level = info 定义的全局日志级别
 *      com.lz.demo.log.jul.subpackage.level = SEVERE 定义的包日志级别
 * jul 有 7 级日志级别，slf4j 有 5 级，对应关系分别为
 *      finest   trace
 *      finer    debug
 *      fine     debug
 *      config   info
 *      info     info
 *      warn     warn
 *      severe   error
 */
public class JulToLogbackTest {

    // 使用 static 代码块加载自定义的配置文件 resources/logging.properties（如果注释 static 代码块，是 $JAVA_HOME/jre/lib/logging.properties 生效）
    static {
        // 通过类加载器读取配置文件
        InputStream ins = JulToLogbackTest.class.getClassLoader().getResourceAsStream("logging.properties");
        // 创建 LogManager
        LogManager logManager = LogManager.getLogManager();

        // 通过 LogManager 加载配置文件
        try {
            logManager.readConfiguration(ins);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    static Logger LOGGER = Logger.getLogger(JulToLogbackTest.class.getName());

    public static void main( String[] args ) {
        LOGGER.finest("jul finest message.");
        LOGGER.finer("jul finer message.");
        LOGGER.fine("jul fine message.");
        LOGGER.config("jul config message.");
        LOGGER.info("jul info message.");
        LOGGER.warning("jul warning message.");
        LOGGER.severe("jul severe message.");

        SubPackageTest.test();
    }
}
